package com.carlinfo.userscenter.common.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

import com.carlinfo.userscenter.users.pojo.ARole;

/**
 * ~测试反射的例子
 * @author JayLong
 *
 */
public class ReflectMain
{
	public static void main(String[] args)
	{
		/* 对class文件描述 的对象,Class */
		try
		{
			/* 获取Class对象有三种 */
			/* 第一种 */
			Class pojoCla1 = Class.forName("com.carlinfo.userscenter.users.pojo.ARole");
			System.out.println("==pojoCla1==" + pojoCla1);
			/* 第二种(类名.class) */
			Class pojoCla2 = ARole.class;
			System.out.println("==pojoCla2==" + pojoCla2);
			/* 方法三: */
			ARole role = new ARole();
			Class pojoCla3 = role.getClass();
			System.out.println("==pojoCla3==" + pojoCla3);
			/* 获取属性 */
			Field[] fields = pojoCla1.getDeclaredFields();
			/* 如何循环数组 */
			System.out.println("Field===Arrays.toString===" + Arrays.toString(fields));
			for (int i = 0; i < fields.length; i++)
			{
				Field field = fields[i];
				System.out.println(i + "===Field循环===" + field.getName());
			}
			/* 获取方法 */
			Method[] methods = pojoCla1.getMethods();
			System.out.println("Method===Arrays.toString===" + Arrays.toString(methods));
			for (int i = 0; i < methods.length; i++)
			{
				Method method = methods[i];
				System.out.println(i + "===method循环===" + method.getName());
			}
			/* 执行方法 */
			System.out.println("=========setNameMethod开始调用===========");
			/*
			 * setName,getName
			 * ~需要获取到Method对象
			 * ~调用invoke方法
			 * ~
			 * ~参数一:方法名
			 * ~参数二:方法的参数类型
			 * */
			Method setNameMethod = pojoCla1.getMethod("setName", String.class);
			/* 如何通过Class,生成一个对象呢 */
			Object obj = pojoCla1.newInstance();
			System.out.println("===newInstance===>" + obj);
			Object res = setNameMethod.invoke(obj, "测试三");
			/* setName没有返回值 */
			System.out.println("===setNameMethod.invoke===" + res);
			
			System.out.println("=========getNameMethod开始调用===========");
			/*
			 * setName,getName
			 * ~需要获取到Method对象
			 * ~调用invoke方法
			 * ~
			 * ~参数一:方法名
			 * ~参数二:方法的参数类型
			 * */
			/* getName方法没有参数,就不用传 */
			Method getNameMethod = pojoCla1.getMethod("getName");
			Object getNameRes = setNameMethod.invoke(obj, "测试三");
			/* getName没有返回值 */
			System.out.println("===getNameMethod.invoke===" + getNameRes);
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		} catch (NoSuchMethodException e)
		{
			e.printStackTrace();
		} catch (SecurityException e)
		{
			e.printStackTrace();
		} catch (InstantiationException e)
		{
			e.printStackTrace();
		} catch (IllegalAccessException e)
		{
			e.printStackTrace();
		} catch (IllegalArgumentException e)
		{
			e.printStackTrace();
		} catch (InvocationTargetException e)
		{
			e.printStackTrace();
		}
	}
}
